Conversation
…haustiveDependencies` configuration (#6398)
Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> Co-authored-by: siketyan <12772118+siketyan@users.noreply.github.com> Co-authored-by: dyc3 <1808807+dyc3@users.noreply.github.com> Co-authored-by: ematipico <602478+ematipico@users.noreply.github.com> Co-authored-by: Conaclos <2358560+Conaclos@users.noreply.github.com>
…utes (#6506) Co-authored-by: Arend van Beelen jr. <arend@arendjr.nl> Co-authored-by: dyc3 <1808807+dyc3@users.noreply.github.com> Co-authored-by: arendjr <533294+arendjr@users.noreply.github.com> Co-authored-by: Conaclos <2358560+Conaclos@users.noreply.github.com> Co-authored-by: matthewkeil <18608739+matthewkeil@users.noreply.github.com> Co-authored-by: ematipico <602478+ematipico@users.noreply.github.com>
…ors (#6159) Co-authored-by: bavalpey <bavalpey@users.noreply.github.com> Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> Co-authored-by: ematipico <602478+ematipico@users.noreply.github.com> Co-authored-by: PointSingularity <56246797+PointSingularity@users.noreply.github.com> Co-authored-by: siketyan <12772118+siketyan@users.noreply.github.com>
Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> Co-authored-by: ematipico <602478+ematipico@users.noreply.github.com> Co-authored-by: dyc3 <1808807+dyc3@users.noreply.github.com>
# Conflicts: # crates/biome_lsp/src/handlers/text_document.rs # packages/@biomejs/backend-jsonrpc/src/workspace.ts
Co-authored-by: Emanuele Stoppa <my.burning@gmail.com> Co-authored-by: Naoki Ikeguchi <me@s6n.jp>
# Conflicts: # .changeset/shaky-experts-sit.md # crates/biome_module_graph/src/lib.rs
🦋 Changeset detectedLatest commit: a78e878 The changes in this PR will be included in the next version bump. This PR includes changesets to release 14 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
WalkthroughAdds HTML interpolation support and related parser/lexer/token-source changes driven by new HtmlParseOptions/HtmlParseOptions re-exports; expands HTML formatter to handle new text-expression variants and updates benchmarks/tests. Threads working-directory into reporters and reporter visitor APIs and refactors summary reporter to produce per-file counts and clickable file links. Introduces many lint promotions/renames and several new rules (including Qwik rule domains), adds sorting options for assist actions, adjusts CLI workspace APIs (watcher/scan_project/is_path_ignored params), exposes wasm module-graph utilities, and updates configuration schema/options and tests. Possibly related PRs
Suggested reviewers
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
Status, Documentation and Community
|
|
TIL that you can't use "Create merge commit" if you have merge commits from I rebased |
I don't think so 🤔 Can I reset to 7d00fdd and try merging? |
|
I think that's coming from this restriction in the branch protection rule.
|
|
As merging |
|
With the restriction, we can't use merge commit anyway even if we removed merge commits from the |
|
Would you like to do that? I probably don't understand the solution, so it's best if you do the rebase since you understand what we need to remove |
|
@ematipico I restored the original state before you rebased the branch. Feel free to merge (bypassing rules) whenever you like :) |
|
With the previous release I also just ignored the restriction. Rebasing everything can be quite tedious, and there's really not much harm in having an occasional merge commit in the history. |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
crates/biome_graphql_syntax/src/file_source.rs (1)
39-41: Clarify intent: we treat .graphql and .graphqls the sameYou link to the difference, but the implementation maps both to the same variant. A short note avoids confusion for readers expecting different handling.
Apply this diff to add the note:
/// See the difference between .graphql and .graphqls files here: /// https://www.apollographql.com/docs/kotlin/essentials/file-types#sdl-schemas-graphqls - /// https://graphql.com/learn/schema/#inspecting-the-schema + /// https://graphql.com/learn/schema/#inspecting-the-schema + /// Note: Biome currently treats .graphql and .graphqls equivalently; no schema/operation distinction is made.Optional: consider swapping the second link to the official GraphQL docs (https://graphql.org/learn/schema/) for longevity.
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
crates/biome_cli/tests/snapshots/main_commands_format/can_format_graphphs_files.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (3)
.changeset/legal-mugs-care.md(1 hunks)crates/biome_cli/tests/commands/format.rs(3 hunks)crates/biome_graphql_syntax/src/file_source.rs(2 hunks)
✅ Files skipped from review due to trivial changes (1)
- .changeset/legal-mugs-care.md
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{rs,toml}
📄 CodeRabbit Inference Engine (CLAUDE.md)
Format code (Rust + TOML) using
just formatFormat Rust and TOML files before committing (use
just f/just format).
Files:
crates/biome_graphql_syntax/src/file_source.rscrates/biome_cli/tests/commands/format.rs
crates/biome_*/**/*
📄 CodeRabbit Inference Engine (CLAUDE.md)
Core crates must be located in
/crates/biome_*/
Files:
crates/biome_graphql_syntax/src/file_source.rscrates/biome_cli/tests/commands/format.rs
🧠 Learnings (6)
📚 Learning: 2025-08-11T11:48:27.756Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-08-11T11:48:27.756Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/language.rs : Create tests/language.rs defining HtmlTestFormatLanguage and implement TestFormatLanguage for it
Applied to files:
crates/biome_cli/tests/commands/format.rs
📚 Learning: 2025-08-11T11:48:27.756Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-08-11T11:48:27.756Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/spec_test.rs : Create tests/spec_test.rs implementing the run(spec_input_file, _expected_file, test_directory, _file_type) function as shown and include!("language.rs")
Applied to files:
crates/biome_cli/tests/commands/format.rs
📚 Learning: 2025-08-11T11:48:27.756Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-08-11T11:48:27.756Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/spec_tests.rs : Create tests/spec_tests.rs in the biome_html_formatter crate that generates tests via tests_macros::gen_tests! for all HTML files at tests/specs/html/**/*.html
Applied to files:
crates/biome_cli/tests/commands/format.rs
📚 Learning: 2025-08-11T11:48:51.994Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-08-11T11:48:51.994Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : Import the FormatNode trait and implement it for your Node
Applied to files:
crates/biome_cli/tests/commands/format.rs
📚 Learning: 2025-08-11T11:48:51.994Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-08-11T11:48:51.994Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : Use the generic Format trait and FormatNode for AST nodes when implementing the formatter
Applied to files:
crates/biome_cli/tests/commands/format.rs
📚 Learning: 2025-08-05T13:25:32.395Z
Learnt from: CR
PR: biomejs/biome#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-05T13:25:32.395Z
Learning: Applies to benches/html_formatter.rs : Benchmark for HTML formatter must be in `benches/html_formatter.rs`
Applied to files:
crates/biome_cli/tests/commands/format.rs
🧬 Code Graph Analysis (1)
crates/biome_cli/tests/commands/format.rs (2)
crates/biome_cli/tests/main.rs (1)
run_cli(332-347)crates/biome_cli/tests/snap_test.rs (2)
assert_cli_snapshot(407-409)assert_file_contents(438-449)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (25)
- GitHub Check: Bench (biome_module_graph)
- GitHub Check: Bench (biome_html_formatter)
- GitHub Check: Bench (biome_configuration)
- GitHub Check: Bench (biome_html_parser)
- GitHub Check: Bench (biome_package)
- GitHub Check: Bench (biome_graphql_formatter)
- GitHub Check: Bench (biome_graphql_parser)
- GitHub Check: Bench (biome_json_formatter)
- GitHub Check: Bench (biome_json_analyze)
- GitHub Check: Bench (biome_css_analyze)
- GitHub Check: Bench (biome_json_parser)
- GitHub Check: Bench (biome_css_parser)
- GitHub Check: Bench (biome_js_analyze)
- GitHub Check: Bench (biome_js_parser)
- GitHub Check: Bench (biome_css_formatter)
- GitHub Check: Bench (biome_js_formatter)
- GitHub Check: Documentation
- GitHub Check: Test (depot-ubuntu-24.04-arm-16)
- GitHub Check: Test (depot-windows-2022-16)
- GitHub Check: Test Node.js API
- GitHub Check: Check Dependencies
- GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
- GitHub Check: Lint project (depot-windows-2022)
- GitHub Check: autofix
- GitHub Check: Build @biomejs/wasm-web
🔇 Additional comments (4)
crates/biome_graphql_syntax/src/file_source.rs (1)
45-45: LGTM: recognise .graphqls as an extensionGood call adding "graphqls" alongside "graphql" and "gql". Case-insensitivity is already handled upstream via to_ascii_lowercase_cow(), so this is consistent.
crates/biome_cli/tests/commands/format.rs (3)
160-161: Whitespace-only change — no action neededLooks like a harmless newline tweak. Nothing to do here.
162-175: Good addition: schema fixture for .graphqlsThe new SPACING_GRAPHQLS_SANITY_BEFORE fixture is clear and representative for a spacing sanity check.
3550-3575: Nice coverage for write-mode syntax errorsGood to assert that --write fails on invalid syntax and leaves the file untouched. Complements format_shows_parse_diagnostics nicely.
| #[test] | ||
| fn can_format_graphphs_files() { | ||
| let fs = MemoryFileSystem::default(); | ||
| let mut console = BufferConsole::default(); | ||
|
|
||
| let file_path = Utf8Path::new("file.graphqls"); | ||
| fs.insert(file_path.into(), SPACING_GRAPHQLS_SANITY_BEFORE.as_bytes()); | ||
|
|
||
| let (fs, result) = run_cli( | ||
| fs, | ||
| &mut console, | ||
| Args::from(["format", "--write", file_path.as_str()].as_slice()), | ||
| ); | ||
|
|
||
| assert!(result.is_ok(), "run_cli returned {result:?}"); | ||
|
|
||
| assert_cli_snapshot(SnapshotPayload::new( | ||
| module_path!(), | ||
| "can_format_graphphs_files", | ||
| fs, | ||
| console, | ||
| result, | ||
| )); | ||
| } | ||
|
|
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Fix typo in test name and strengthen the assertion
Two tweaks:
- Typo: graphphs → graphqls (both function name and snapshot key)
- Optional: sanity-check that the file actually changed after formatting
Apply this diff within the shown range:
-#[test]
-fn can_format_graphphs_files() {
+#[test]
+fn can_format_graphqls_files() {
let fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();
let file_path = Utf8Path::new("file.graphqls");
fs.insert(file_path.into(), SPACING_GRAPHQLS_SANITY_BEFORE.as_bytes());
let (fs, result) = run_cli(
fs,
&mut console,
Args::from(["format", "--write", file_path.as_str()].as_slice()),
);
assert!(result.is_ok(), "run_cli returned {result:?}");
+
+ // Sanity: ensure the formatter changed the file
+ let mut content = String::new();
+ fs.open(file_path).unwrap().read_to_string(&mut content).unwrap();
+ assert_ne!(
+ content,
+ SPACING_GRAPHQLS_SANITY_BEFORE,
+ "expected the GraphQL schema to be reformatted"
+ );
assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
- "can_format_graphphs_files",
+ "can_format_graphqls_files",
fs,
console,
result,
));
}If there are any other lingering “graphphs” typos in the repo, a quick scan helps:
🏁 Script executed:
#!/bin/bash
# Find any misspellings of "graphphs" across the repo
rg -n --no-ignore-vcs --hidden 'graphphs'Length of output: 205
Fix typo in test name and add sanity‐check in format test
In crates/biome_cli/tests/commands/format.rs (lines 3382–3406):
- Rename occurrences of “graphphs” → “graphqls” (function name & snapshot key).
- After
run_cli, read back the file and assert its contents differ from the unformatted input.
#[test]
-fn can_format_graphphs_files() {
+fn can_format_graphqls_files() {
let fs = MemoryFileSystem::default();
let mut console = BufferConsole::default();
let file_path = Utf8Path::new("file.graphqls");
fs.insert(file_path.into(), SPACING_GRAPHQLS_SANITY_BEFORE.as_bytes());
let (fs, result) = run_cli(
fs,
&mut console,
Args::from(["format", "--write", file_path.as_str()].as_slice()),
);
assert!(result.is_ok(), "run_cli returned {result:?}");
+ // Sanity check: ensure the formatter changed the file
+ let mut content = String::new();
+ fs.open(file_path).unwrap().read_to_string(&mut content).unwrap();
+ assert_ne!(
+ content,
+ SPACING_GRAPHQLS_SANITY_BEFORE,
+ "expected the GraphQL schema to be reformatted"
+ );
assert_cli_snapshot(SnapshotPayload::new(
module_path!(),
- "can_format_graphphs_files",
+ "can_format_graphqls_files",
fs,
console,
result,
));
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| #[test] | |
| fn can_format_graphphs_files() { | |
| let fs = MemoryFileSystem::default(); | |
| let mut console = BufferConsole::default(); | |
| let file_path = Utf8Path::new("file.graphqls"); | |
| fs.insert(file_path.into(), SPACING_GRAPHQLS_SANITY_BEFORE.as_bytes()); | |
| let (fs, result) = run_cli( | |
| fs, | |
| &mut console, | |
| Args::from(["format", "--write", file_path.as_str()].as_slice()), | |
| ); | |
| assert!(result.is_ok(), "run_cli returned {result:?}"); | |
| assert_cli_snapshot(SnapshotPayload::new( | |
| module_path!(), | |
| "can_format_graphphs_files", | |
| fs, | |
| console, | |
| result, | |
| )); | |
| } | |
| #[test] | |
| fn can_format_graphqls_files() { | |
| let fs = MemoryFileSystem::default(); | |
| let mut console = BufferConsole::default(); | |
| let file_path = Utf8Path::new("file.graphqls"); | |
| fs.insert(file_path.into(), SPACING_GRAPHQLS_SANITY_BEFORE.as_bytes()); | |
| let (fs, result) = run_cli( | |
| fs, | |
| &mut console, | |
| Args::from(["format", "--write", file_path.as_str()].as_slice()), | |
| ); | |
| assert!(result.is_ok(), "run_cli returned {result:?}"); | |
| // Sanity check: ensure the formatter changed the file | |
| let mut content = String::new(); | |
| fs.open(file_path).unwrap().read_to_string(&mut content).unwrap(); | |
| assert_ne!( | |
| content, | |
| SPACING_GRAPHQLS_SANITY_BEFORE, | |
| "expected the GraphQL schema to be reformatted" | |
| ); | |
| assert_cli_snapshot(SnapshotPayload::new( | |
| module_path!(), | |
| "can_format_graphqls_files", | |
| fs, | |
| console, | |
| result, | |
| )); | |
| } |
| pub fn try_from_language_id(language_id: &str) -> Result<Self, FileSourceError> { | ||
| match language_id { | ||
| "graphql" | "gql" => Ok(Self::default()), | ||
| "graphqls" | "graphql" | "gql" => Ok(Self::default()), |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Sanity-check: is "graphqls" a widely used languageId?
Many editors/tools only emit "graphql" as the languageId. Accepting "graphqls" is harmless, but let’s confirm it’s used in the wild and ensure tests cover it.
Run this script to check where "graphqls" is referenced in the repo (tests, config, docs):
And, to confirm whether VS Code or LSP conventions include "graphqls" as a languageId, please run this web query:
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo 'Occurrences of "graphqls" across the repo:'
rg -n --pretty --hidden --glob '!.git' '"graphqls"'
echo
echo 'Callers/tests for try_from_language_id/try_from_extension:'
rg -n --pretty --hidden --glob '!.git' 'try_from_language_id|try_from_extension'Length of output: 4527
🌐 Web query:
Does VS Code or common GraphQL extensions define "graphqls" as a language identifier (languageId), or is "graphql" the de-facto standard?
💡 Result:
The de-facto standard language identifier (languageId) for GraphQL in VS Code and its common extensions is "graphql". Neither VS Code core nor major GraphQL extensions define "graphqls" as a language identifier; "graphql" is used for both query documents and schema files.
Supporting details:
-
The official [VS Code language identifiers documentation][8] only mentions "graphql" as a recognized language mode; "graphqls" is not documented as a languageId.
-
The most popular and canonical GraphQL extensions—including GraphQL for VSCode[7], Apollo's editor extension[6], and vscode-graphql by GraphQL Foundation[2][5]—all use "graphql" as the languageId for syntax highlighting, autocompletion, and language server features.
-
File associations in the extensions typically map both
.graphqland.gqlfiles (and sometimes.graphqls) to the "graphql" languageId[2][4][5]. The naming "graphqls" as an extension for schema files (.graphqls) is a file extension convention in some codebases but does not imply a separate languageId. -
For example, the [vscode-graphql extension documentation][2][5] only references "graphql" as the language identifier—and "graphql" is the value used internally for language features, regardless of whether the file is a schema or a query.
-
Some developers use
.graphqlsas a filename extension for GraphQL schema files, but this is a convention at the file system level and does not affect the languageId, which remains "graphql"[2][4].
Summary table:
| File Extensions | languageId used by VS Code/extensions |
|---|---|
| .graphql, .gql, .graphqls | graphql |
Conclusion:
Use "graphql" as the languageId for both GraphQL queries and schemas in VS Code and common extensions. The identifier "graphqls" is not registered as a languageId; it's only seen occasionally as a filename extension convention[2][5][8].
Citations:
- 1: https://community.apollographql.com/t/vs-code-extension-not-working-with-graphql-code-gen/5628
- 2: https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql
- 3: https://graphql.org/learn/schema/
- 4: https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql-syntax
- 5: https://github.com/graphql/vscode-graphql
- 6: https://www.apollographql.com/docs/ide-support/vs-code
- 7: https://marketplace.visualstudio.com/items?itemName=kumar-harsh.graphql-for-vscode
- 8: https://code.visualstudio.com/docs/languages/identifiers
Align GraphQL languageId with VS Code conventions
Our investigation shows that VS Code and major GraphQL extensions only emit “graphql” (not “graphqls”) as the languageId, while .graphqls remains a file-extension convention. To bring our code in line:
• In crates/biome_graphql_syntax/src/file_source.rs → try_from_language_id (around line 58), remove “graphqls” from the match arm:
- "graphqls" | "graphql" | "gql" => Ok(Self::default()),
+ "graphql" | "gql" => Ok(Self::default()),• Leave the .graphqls mapping in try_from_extension (around line 45) so schema files still resolve correctly.
• Add a unit test in biome_graphql_syntax to verify try_from_extension("graphqls") returns the expected GraphqlFileSource.
This change trims a redundant languageId while preserving support for the .graphqls extension.
🤖 Prompt for AI Agents
In crates/biome_graphql_syntax/src/file_source.rs around line 58, the match arm
for try_from_language_id incorrectly includes "graphqls" as a languageId; remove
"graphqls" so only "graphql" | "gql" map to Ok(Self::default()). Keep the
existing ".graphqls" mapping in try_from_extension (around line 45) unchanged so
schema file extensions still resolve. Add a unit test in the
biome_graphql_syntax tests that calls try_from_extension("graphqls") and asserts
it returns the expected GraphqlFileSource variant to ensure .graphqls is still
supported.


Summary
Test Plan
Docs